package com.homson.coreservice.servicecommon.request;

import java.util.Objects;

/**
 * 带分页参数的请求参数类
 * @param <T> 请求体的类型
 */
public class PageRequestParameter<T> extends RequestParameter<T> {
    
    /**
     * 页码，默认为1
     */
    private Integer page = 1;
    
    /**
     * 每页大小，默认为10
     */
    private Integer size = 10;
    
    /**
     * 默认构造函数
     */
    public PageRequestParameter() {
        super();
    }
    
    /**
     * 包含请求体的构造函数
     * @param body 请求体
     */
    public PageRequestParameter(T body) {
        super(body);
    }
    
    /**
     * 包含分页参数的构造函数
     * @param page 页码
     * @param size 每页大小
     */
    public PageRequestParameter(Integer page, Integer size) {
        this.page = page;
        this.size = size;
    }
    
    /**
     * 包含请求体和分页参数的构造函数
     * @param body 请求体
     * @param page 页码
     * @param size 每页大小
     */
    public PageRequestParameter(T body, Integer page, Integer size) {
        super(body);
        this.page = page;
        this.size = size;
    }
    
    /**
     * 获取页码
     * @return 页码
     */
    public Integer getPage() {
        return page;
    }
    
    /**
     * 设置页码
     * @param page 页码
     */
    public void setPage(Integer page) {
        this.page = page;
    }
    
    /**
     * 获取每页大小
     * @return 每页大小
     */
    public Integer getSize() {
        return size;
    }
    
    /**
     * 设置每页大小
     * @param size 每页大小
     */
    public void setSize(Integer size) {
        this.size = size;
    }
    
    /**
     * 计算偏移量
     * @return 偏移量 (page-1)*size
     */
    public Integer getOffset() {
        if (page == null || size == null) {
            return 0;
        }
        return (page - 1) * size;
    }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof PageRequestParameter)) return false;
        if (!super.equals(o)) return false;
        
        PageRequestParameter<?> that = (PageRequestParameter<?>) o;
        
        if (!Objects.equals(page, that.page)) return false;
        return Objects.equals(size, that.size);
    }
    
    @Override
    public int hashCode() {
        int result = super.hashCode();
        result = 31 * result + (page != null ? page.hashCode() : 0);
        result = 31 * result + (size != null ? size.hashCode() : 0);
        return result;
    }
    
    @Override
    public String toString() {
        return "PageRequestParameter{" +
                "body=" + this.getBody() +
                ", page=" + page +
                ", size=" + size +
                '}';
    }
}
